<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"> <meta name="viewport" content="width=device-width">
    <title>顶点覆盖问题度数贪心算法的一个下界</title>
    <meta name="viewport" content="width=device-width,initial-scale=1, shrink-to-fit=no">
    <!-- Bootstrap CSS -->
    <link rel="stylesheet"
          href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.0/dist/css/bootstrap.min.css"
          integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk"
          crossorigin="anonymous">
    <link rel="stylesheet"
          href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.5.0/styles/androidstudio.min.css">
<!--    <link rel="stylesheet" href="/web_template_css.css">-->
    <!-- this is highlight.js -->
    <script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script>
    <script id="MathJax-script" async
            src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">
    </script>
    <script  src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"
    integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"
    integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.0/dist/js/bootstrap.min.js"
    integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.5.0/highlight.min.js"></script>
    <style>
      img{
        display: block;
        height: auto;
        max-width: 100%;
      }
    </style>
  </head>
  <body>
    <nav class="navbar navbar-expand-lg navbar-light bg-light">
        <a class="navbar-brand" href="#">kvrmnks</a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
          <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarNav">
          <ul class="navbar-nav">
            <li class="nav-item active">
              <a class="nav-link" href="./../../../../../index.html" target="_self">Home <span class="sr-only">(current)</span></a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="./../../../../../blog.html">Blog</a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="./../../../../../about.html">About</a>
            </li>
          </ul>
        </div>
      </nav>



    <div class='container'>
      <h2>顶点覆盖问题度数贪心算法的一个下界</h2>

<hr>

<p>这个是我做课后题遇到了，结果我构造了大约50min...</p>

<hr>

<h4>度数贪心算法</h4>

<p>先描述一下这个贪心近似算法.</p>

<p>假设一张图\(G=&lt;V,E&gt;\), 存在映射\(degree:V \rightarrow Z^{+}, degree(x) = \#\{xy|xy \in E\}\)</p>

<p>算法每次得到\(x = \operatorname{argmax}_{degree(x)}{x}\)</p>

<p>令\(S = S\bigcup\{x\}\)</p>

<p>\(E = E - \{xy|xy\in E\}\)</p>

<p>\(V = V / \{x\}\)</p>

<p>\(S\)便是这种放的得到的一个贪心解。</p>

<p>说人话就是给一张图，每次找度数最大的顶点，然后删掉这个点和关联边继续这个过程。</p>

<h4>度数贪心算法的一个近似度下界</h4>

<p>先说结论吧，结论是存在一种图，可以让这个算法的近似度下界为\(O (\log{n})\)</p>

<p>下面我们就来构造这类图</p>

<p>我们先定义一个上部结点和下部结点。</p>

<p>令上部结点中有\(n\)个结点，按照随便一个顺序编成\(1\cdots n\)号结点。</p>

<p>下部结点由\(n\)的小部分构成，第\(i\)个部分有\(\lfloor \frac{n}{i}\rfloor\)个结点</p>

<p>下面我们来构造边，考虑第\(i\)个小部分, 为了**描述方便**给这个小部分编号为\(1\cdots \lfloor \frac{n}{i} \rfloor\)。</p>

<p>对于每个上部结点，都按某种规律与**一个**小部分中的结点相连，假设现在是编号为\(j\)的上部结点，构造边\(j - ((j \quad mod \quad \lfloor\frac{n}{i} \rfloor)  + 1)\)</p>

<p><img src="image-20201128150616101.png" alt="image-20201128150616101" style="zoom: 33%;" /></p>

<p>类似上图</p>

<hr>

<p>现在来尝试证明这个下界</p>

<p>首先我们可以知道取所有的上部结点作为答案便是一个最小的顶点覆盖。</p>

<p>也就是说对于这类图的最优解是\(n\)</p>

<p>如果你对调和级数熟悉的话你会发现下部结点的个数和，即\(\sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor = O(n\log{n})\)</p>

<p>于是如果我们能证明这个算法在某种最坏情况(因为有的时候会有多个点度数相同)下每次都会选取下部结点中的某个加入答案的话，那么我们就能证明这类图能够使得近似度下界达到\(O(\log{n})\)</p>

<p>我们首先将一类下部结点看做一个整体。</p>

<p>即\(P_{k} = \{i|\lfloor \frac{n}{i}\rfloor = k\}\)</p>

<p>之所以要这样划分整个下部结点，是因为每个\(P_{k}\)中的不同编号的小部分其中度数有着相同的分布。</p>

<hr>

<h5>定理一</h5>

<p>\(P_{j} \quad j &lt;i\)中的小部分中的最大点度数一定小于\(P_{i}\)中的最小点度数。</p>

<p>令\(p \in P_{j}, q\in P_{i}\)</p>

<p>\[n = jp +a \\ n = iq + b\]</p>

<p>根据上面连边的顺序可以得到，\(P_{j}\)中的最大点度数为\(j+1\)，而\(P_{i}\)中的最小点度数为\(i\)，由条件\(j &lt; i\)得到这个定理成立。</p>

<p>这个定理代表的是如果在不考虑上部结点时，一定是先取编号比较大的小部分中的点作为答案。</p>

<hr>

<h5>定理二</h5>

<p>在任意时刻，下部顶点的最大点度一定大于等于上部顶点的最大点度。</p>

<p>首先发现一个小性质，在取下部顶点作为答案时，不会改变下部结点中其他节点的点度，而只会改变上部结点的点度，且一定是变小。</p>

<p>于是我们可以把一个小部分看做一个整体，每次取完一个小部分假设取完了第\(i\)个小部分，则这个时候上部结点中每个结点的度数均为\(i-1\)</p>

<p>由\(n = k(i-1)+a\)</p>

<p>第\(i-1\)个小部分的最小度数为\(\lfloor\frac{n}{k}\rfloor\)</p>

<p>这个显然大于等于\(i-1\)</p>

<hr>

<h4>后话</h4>

<p>利用集合覆盖的近似度可以证明这个算法的上界也是\(O(\log{n})\)的。</p>


    </div>
    <script>
      hljs.initHighlightingOnLoad()
    </script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/highlightjs-line-numbers.js/2.5.0/highlightjs-line-numbers.min.js"></script>
  <script>
      hljs.initHighlightingOnLoad();
      hljs.initLineNumbersOnLoad();
  </script>
  </body>
</html>